package util;

import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @auther hewenhui
 * @see <a href="hetp://www.codingmaster.com> java </a>
 */
public class DBUtil {
    private static volatile  DataSource dataSource = null;//这是单例模式
    private static String jdbcUrl = "jdbc:mysql://localhost:3306/shop_db?allowPublicKeyRetrieval=true&characterEncoding=utf8&useSSL=false";
    private static String username = "root";
    private static String password = "hewenhui";
    //DataSource只有一个对象dataSource
    //这个对象可以创建出很多的连接对象Connection

    //内部使用，封装get数据库对象
    private static DataSource getDataSource(){
        //这里加if判断是为了加快速度，因为加锁会消耗一定的资源。
        if(dataSource==null){
            synchronized (DBUtil.class){
                if(dataSource==null){//懒汉模式，第一次用的时候在进行创建
                    dataSource=new MysqlDataSource();
                    ((MysqlDataSource)dataSource).setUrl(jdbcUrl);
                    ((MysqlDataSource)dataSource).setUser(username);
                    ((MysqlDataSource)dataSource).setPassword(password);
                }
            }
        }
        return dataSource;
    }

    //封装get连接数据库对象
    public static Connection getConnection(){
        try {
            //差一点就写bug了！
            return DBUtil.getDataSource().getConnection();
        } catch (SQLException e) {
            //throw new RuntimeException(e); //写这个异常return null哪里就会提示错误
            e.printStackTrace();// 为什么要使用这个来抛出异常
        }
        return null;
    }



    //把释放资源的函数进行封装，没有使用到的可以传入参数null
    public static void close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if(preparedStatement!=null){
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

    
}
